<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>创建集合类</title>
</head>
<body>
<script>
    // 封装集合的构造函数
    function Set() {
        // 使用一个对象来保存集合的元素
        this.items = {}

        // 集合的操作方法
        // 判断集合中是否有某个元素
        Set.prototype.has = function (value) {
            return this.items.hasOwnProperty(value)
        }

        // 向集合中添加元素
        Set.prototype.add = function (value) {
            // 1.判断集合中是否已经包含了该元素
            if (this.has(value)) return false

            // 2.将元素添加到集合中
            this.items[value] = value
            return true
        }

        // 从集合中删除某个元素
        Set.prototype.remove = function (value) {
            // 1.判断集合中是否包含该元素
            if (!this.has(value)) return false

            // 2.包含该元素, 那么将元素删除
            delete this.items[value]
            return true
        }

        // 清空集合中所有的元素
        Set.prototype.clear = function () {
            this.items = {}
        }

        // 获取集合的大小
        Set.prototype.size = function () {
            return Object.keys(this.items).length

            /*
            考虑兼容性问题, 使用下面的代码
            var count = 0
            for (var value in this.items) {
                if (this.items.hasOwnProperty(value)) {
                    count++
                }
            }
            return count
            */
        }

        // 获取集合中所有的值
        Set.prototype.values = function () {
            return Object.keys(this.items)

            /*
            考虑兼容性问题, 使用下面的代码
            var keys = []
            for (var value in this.items) {
                keys.push(value)
            }
            return keys
            */
        }

        // 集合的并集
        Set.prototype.union = function (otherSet) {

        }
    }

    // 测试和使用集合类
    var set = new Set()

    // 添加元素
    set.add(1)
    alert(set.values()) // 1
    set.add(1)
    alert(set.values()) // 1

    set.add(100)
    set.add(200)
    alert(set.values()) // 1,100,200

    // 判断是否包含元素
    alert(set.has(100)) // true

    // 删除元素
    set.remove(100)
    alert(set.values()) // 1, 200

    // 获取集合的大小
    alert(set.size()) // 2
    set.clear()
    alert(set.size()) // 0
</script>
</body>
</html>